/*
 * @Description: 异常处理中间件
 * @Author: Junhuang
 * @Date: 2022-02-08 12:14:43
 * @LastEditTime: 2022-02-09 16:14:30
 * @LastEditors: Junhuang
 * @Reference: 
 */
// app/middleware/error_handler.js
// 注意中间件的名称是驼峰形式命名，而文件名称采用下划线分割形式命名，但名称要一致
module.exports = (option, app) => {
  return async function errorHandler(ctx, next) {
    try {
      await next();
      // 404 处理
      if (ctx.status === 404 && !ctx.body) {
        ctx.body = {
          msg: 'fail',
          data: '404错误'
        }
      }
    } catch (err) {
      // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
      ctx.app.emit('error', err, ctx);

      const status = err.status || 500;
      // 生产环境时 500 错误的详细错误内容不返回给客户端，因为可能包含敏感信息
      const error = status === 500 && ctx.app.config.env === 'prod'
        ? 'Internal Server Error'
        : err.message;

      // 从 error 对象上读出各个属性，设置到响应中
      ctx.body = {
        msg: 'fail',
        data: error
      };
      // ctx.body = { error };
      // status === 422 代表参数验证错误
      if (status === 422) {
        const _errs = err.errors;
        ctx.body.detail = _errs;
        if (_errs.length > 0 && _errs[0].err && _errs[0].err[0]) {
          ctx.body.data = _errs[0].err[0];
        }
      }
      ctx.status = status;
    }
  };
};